home *** CD-ROM | disk | FTP | other *** search
- /* -------------- button.c -------------- */
-
- #include "dflat.h"
-
- int ButtonProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
- {
- CTLWINDOW *ct = GetControl(wnd);
- int x;
- if (ct != NULL) {
- switch (msg) {
- case SETFOCUS:
- BaseWndProc(BUTTON, wnd, msg, p1, p2);
- /* ------- fall through ------- */
- case PAINT:
- if (isVisible(wnd)) {
- if (TestAttribute(wnd, SHADOW)) {
- /* -------- draw the button's shadow ------- */
- background = WndBackground(GetParent(wnd));
- foreground = BLACK;
- for (x = 1; x <= WindowWidth(wnd); x++)
- wputch(wnd, 223, x, 1);
- wputch(wnd, 220, WindowWidth(wnd), 0);
- }
- if (ct->itext != NULL) {
- unsigned char *txt;
- if ((txt = calloc(1, strlen(ct->itext)+10)) != NULL) {
- if (ct->setting == OFF) {
- txt[0] = CHANGECOLOR;
- txt[1] = wnd->WindowColors [HILITE_COLOR] [FG] | 0x80;
- txt[2] = wnd->WindowColors [STD_COLOR] [BG] | 0x80;
- }
- CopyCommand(txt+strlen(txt), ct->itext, !ct->setting,
- WndBackground(wnd));
- SendMessage(wnd, CLEARTEXT, 0, 0);
- SendMessage(wnd, ADDTEXT, (PARAM) txt, 0);
- free(txt);
- }
- }
- /* --------- write the button's text ------- */
- WriteTextLine(wnd, NULL, 0, wnd == inFocus);
- }
- return TRUE;
- case KEYBOARD:
- if (p1 != '\r')
- break;
- /* ---- fall through ---- */
- case LEFT_BUTTON:
- /* --------- draw a pushed button -------- */
- background = WndBackground(GetParent(wnd));
- foreground = WndBackground(wnd);
- wputch(wnd, ' ', 0, 0);
- for (x = 0; x < WindowWidth(wnd); x++) {
- wputch(wnd, 220, x+1, 0);
- wputch(wnd, 223, x+1, 1);
- }
- if (msg == LEFT_BUTTON)
- SendMessage(NULL, WAITMOUSE, 0, 0);
- else
- SendMessage(NULL, WAITKEYBOARD, 0, 0);
- SendMessage(wnd, PAINT, 0, 0);
- if (ct->setting == ON)
- PostMessage(GetParent(wnd), COMMAND, ct->command, 0);
- else
- beep();
- return TRUE;
- case HORIZSCROLL:
- return TRUE;
- default:
- break;
- }
- }
- return BaseWndProc(BUTTON, wnd, msg, p1, p2);
- }
-
- int TextProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
- {
- CTLWINDOW *ct;
- switch (msg) {
- case PAINT:
- ct = GetControl(wnd);
- if (ct != NULL && GetText(wnd) == NULL) {
- int i, len;
- char *cp, *cp2 = ct->itext;
-
- len = min(ct->dwnd.h, MsgHeight(cp2));
- cp = cp2;
- for (i = 0; i < len; i++) {
- int mlen;
- char *txt = cp;
- char *cp1 = cp;
- char *np = strchr(cp, '\n');
- if (np != NULL)
- *np = '\0';
- mlen = strlen(cp);
- while ((cp1 = strchr(cp1, SHORTCUTCHAR)) != NULL) {
- mlen += 3;
- cp1++;
- }
- if (np != NULL)
- *np = '\n';
- if ((txt = malloc(mlen+1)) != NULL) {
- CopyCommand(txt, cp, FALSE, WndBackground(wnd));
- txt[mlen] = '\0';
- SendMessage(wnd, ADDTEXT, (PARAM)txt, 0);
- if ((cp = strchr(cp, '\n')) != NULL)
- cp++;
- free(txt);
- }
- }
- }
- break;
- default:
- break;
- }
- return BaseWndProc(TEXT, wnd, msg, p1, p2);
- }
-
- static void SetFocusCursor(WINDOW wnd)
- {
- if (wnd == inFocus) {
- SendMessage(NULL, SHOW_CURSOR, 0, 0);
- SendMessage(wnd, KEYBOARD_CURSOR, 1, 0);
- }
- else
- SendMessage(NULL, HIDE_CURSOR, 0, 0);
- }
-
- int RadioButtonProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
- {
- int rtn;
- DBOX *db = GetParent(wnd)->extension;
- CTLWINDOW *ct = GetControl(wnd);
- if (ct != NULL) {
- switch (msg) {
- case SETFOCUS:
- case MOVE:
- rtn = BaseWndProc(RADIOBUTTON, wnd, msg, p1, p2);
- SetFocusCursor(wnd);
- return rtn;
- case PAINT: {
- char rb[] = "( )";
- if (ct->setting)
- rb[1] = 7;
- SendMessage(wnd, CLEARTEXT, 0, 0);
- SendMessage(wnd, ADDTEXT, (PARAM) rb, 0);
- SetFocusCursor(wnd);
- break;
- }
- case KEYBOARD:
- if ((int)p1 != ' ')
- break;
- case LEFT_BUTTON:
- PushRadioButton(db, ct->command);
- break;
- default:
- break;
- }
- }
- return BaseWndProc(RADIOBUTTON, wnd, msg, p1, p2);
- }
-
- int CheckBoxProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
- {
- int rtn;
- CTLWINDOW *ct = GetControl(wnd);
- if (ct != NULL) {
- switch (msg) {
- case SETFOCUS:
- case MOVE:
- rtn = BaseWndProc(CHECKBOX, wnd, msg, p1, p2);
- SetFocusCursor(wnd);
- return rtn;
- case PAINT: {
- char cb[] = "[ ]";
- if (ct->setting)
- cb[1] = 'X';
- SendMessage(wnd, CLEARTEXT, 0, 0);
- SendMessage(wnd, ADDTEXT, (PARAM) cb, 0);
- SetFocusCursor(wnd);
- break;
- }
- case KEYBOARD:
- if ((int)p1 != ' ')
- break;
- case LEFT_BUTTON:
- ct->setting ^= ON;
- SendMessage(wnd, PAINT, 0, 0);
- break;
- default:
- break;
- }
- }
- return BaseWndProc(CHECKBOX, wnd, msg, p1, p2);
- }
-
- int BoxProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
- {
- int rtn;
- CTLWINDOW *ct = GetControl(wnd);
- if (ct != NULL) {
- switch (msg) {
- case SETFOCUS:
- case PAINT:
- return FALSE;
- case LEFT_BUTTON:
- case BUTTON_RELEASED:
- return SendMessage(GetParent(wnd), msg, p1, p2);
- case BORDER:
- rtn = BaseWndProc(BOX, wnd, msg, p1, p2);
- if (ct != NULL)
- if (ct->itext != NULL)
- writeline(wnd, ct->itext, 1, 0, FALSE);
- return rtn;
- default:
- break;
- }
- }
- return BaseWndProc(BOX, wnd, msg, p1, p2);
- }
-
- int SpinButtonProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
- {
- int rtn;
- CTLWINDOW *ct = GetControl(wnd);
- if (ct != NULL) {
- switch (msg) {
- case CREATE_WINDOW:
- wnd->wd -= 2;
- wnd->rc.rt -= 2;
- break;
- case SETFOCUS:
- rtn = BaseWndProc(SPINBUTTON, wnd, msg, p1, p2);
- SetFocusCursor(wnd);
- return rtn;
- case PAINT:
- foreground = FrameForeground(wnd);
- background = FrameBackground(wnd);
- wputch(wnd, UPSCROLLBOX, WindowWidth(wnd), 0);
- wputch(wnd, DOWNSCROLLBOX, WindowWidth(wnd)+1, 0);
- SetFocusCursor(wnd);
- break;
- case LEFT_BUTTON:
- if (p1 == GetRight(wnd) + 1)
- SendMessage(wnd, KEYBOARD, UP, 0);
- else if (p1 == GetRight(wnd) + 2)
- SendMessage(wnd, KEYBOARD, DN, 0);
- if (wnd != inFocus)
- SendMessage(wnd, SETFOCUS, TRUE, 0);
- return TRUE;
- case LB_SETSELECTION:
- rtn = BaseWndProc(SPINBUTTON, wnd, msg, p1, p2);
- wnd->wtop = (int) p1;
- SendMessage(wnd, PAINT, 0, 0);
- return rtn;
- default:
- break;
- }
- }
- return BaseWndProc(SPINBUTTON, wnd, msg, p1, p2);
- }
-